import {
  NestInterceptor,
  ExecutionContext,
  BadGatewayException,
} from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

// 通过拦截器来捕获路由处理函数中的异常 处理当前异常 再抛出一个新的异常
export class ErrorsInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next): Observable<any> {
    console.log('捕获到路由处理函数中抛出的异常 进行处理')
    return next
      .handle()
      .pipe(
        // 通过 catchError 管道操作符捕获上游可观察对象抛出的错误
        // 然后通过 throwError 创建一个发出错误的新可观察对象
        catchError(err => {
          console.log('后置拦截器捕获到异常 ', err?.message)
          return throwError(() => new BadGatewayException())
        }),
      );
  }
}
